package com.warningrc.util;

import java.util.Comparator;
import java.util.EnumMap;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;

/**
 * 操作 {@code java.util.Map} 的一些静态方法
 * @author <a href="http://weibo.com/weibowarning">王宁</a><br/>
 * email: <a href="mailto:childe.wangning@gmail.com">childe.wangning@gmail.com</a>
 * @date  2012-3-12
 */
public final class Maps {
	private Maps() {
	}

	/**
	 * 创建一个可变的，空的 {@code HashMap} 对象.
	 * 
	 * @return 一个可变的，空的 {@code HashMap} 对象
	 */
	public static <K, V> HashMap<K, V> newHashMap() {
		return new HashMap<K, V>();
	}

	/**
	 * 根据 {@code Map} 参数创建一个可变的 {@code HashMap} 对象.
	 */
	public static <K, V> HashMap<K, V> newHashMap(
			Map<? extends K, ? extends V> map) {
		return new HashMap<K, V>(map);
	}

	/**
	 * 创建一个可变的，空的 {@code LinkedHashMap} 对象.
	 */
	public static <K, V> LinkedHashMap<K, V> newLinkedHashMap() {
		return new LinkedHashMap<K, V>();
	}

	/**
	 * 根据 {@code Map} 参数创建一个可变的 {@code LinkedHashMap} 对象.
	 */
	public static <K, V> LinkedHashMap<K, V> newLinkedHashMap(
			Map<? extends K, ? extends V> map) {
		return new LinkedHashMap<K, V>(map);
	}

	/**
	 * 创建一个可变的，空的 {@code TreeMap} 对象.
	 */
	public static <K extends Comparable<?>, V> TreeMap<K, V> newTreeMap() {
		return new TreeMap<K, V>();
	}

	/**
	 * 根据 {@code Map} 参数创建一个可变的 {@code TreeMap} 对象.
	 */
	public static <K, V> TreeMap<K, V> newTreeMap(Map<K, ? extends V> map) {
		return new TreeMap<K, V>(map);
	}

	/**
	 * 创建一个可变的 {@code TreeMap} 对象,该 {@code TreeMap} 对象根据给定比较器进行排序.
	 */
	public static <C, K extends C, V> TreeMap<K, V> newTreeMap(
			Comparator<C> comparator) {
		return new TreeMap<K, V>(comparator);
	}

	/**
	 * 创建一个具有指定键类型的空 {@code EnumMap} 对象。
	 */
	public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap(Class<K> type) {
		return new EnumMap<K, V>(Assert.checkNotNull(type,"type must not be null"));
	}

	/**
	 * 创建一个 {@code EnumMap}，从指定 {@code Map}对其初始化。
	 */
	public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap(
			Map<K, ? extends V> map) {
		return new EnumMap<K, V>(map);
	}

	/**
	 * 创建一个可变的，空的 {@code IdentityHashMap} 对象.
	 */
	public static <K, V> IdentityHashMap<K, V> newIdentityHashMap() {
		return new IdentityHashMap<K, V>();
	}

	/**
	 * 创建一个 {@code HashMap}，从指定 {@code Properties}对其初始化。
	 */
	public static HashMap<String, String> fromProperties(Properties properties) {
		HashMap<String, String> map = newHashMap();
		for (Enumeration<?> e = properties.propertyNames(); e.hasMoreElements();) {
			String key = (String) e.nextElement();
			map.put(key, properties.getProperty(key));
		}
		return map;
	}
}